Pomale zpracovani SELECTU v IB

Otázka od: Jaroslav Kohák

19. 12. 2002 11:47

Ahoj lidi,
bojuju s nasledujicim problemem rychlosti. V asi 200MB DB mam jednu tabulku (A)
ktera slouzi jako master pro druhou - detail(B). Tzn v tabulce A si uzivatel
vybere zaznam a v Becku vidi dalsi detaily. Svazuje je parametr :S21DAVKA_UKID.
Nasledujici select je prave ta tabulka B.

SELECT b.S21DAVKA_UKID, a.S21KOMPID, SUM(a.MNOZSTVI)
FROM S21DAVKAREC a
LEFT JOIN S21DAVKA_UKD b ON (a.S21DAVKAID = b.S21DAVKAID)
WHERE S21DAVKA_UKID = :S21DAVKA_UKID
GROUP BY b.S21DAVKA_UKID, a.S21KOMPID

Problem je v tom, ze pri kazdem posunu mezi radky v tab A probehne zpracovani
tohoto selectu a ono to trva skoro 45!!! sec (na PIII 850 s 256MB RAM a W2K).
Po tu dobu disk skoro nejede, zato sluzba IBServ jede na 100%.
Neda se tomu nejak pomoct, nebo predelat ten select? Zkousel jsem z toho udelat
proceduru v IB a jen ji spoustet, ale to bylo totez.

Diky Tymi

Odpovedá: Roman

19. 12. 2002 11:26

>Ahoj lidi,
>bojuju s nasledujicim problemem rychlosti. V asi 200MB DB mam jednu tabulku
(A) ktera >slouzi jako master pro druhou - detail(B). Tzn v tabulce A si
uzivatel vybere zaznam a v Becku >vidi dalsi detaily. Svazuje je parametr
:S21DAVKA_UKID. Nasledujici select je prave ta >tabulka B.

>SELECT b.S21DAVKA_UKID, a.S21KOMPID, SUM(a.MNOZSTVI)
>FROM S21DAVKAREC a
>LEFT JOIN S21DAVKA_UKD b ON (a.S21DAVKAID = b.S21DAVKAID)
>WHERE S21DAVKA_UKID = :S21DAVKA_UKID
>GROUP BY b.S21DAVKA_UKID, a.S21KOMPID

Nahore pises, ze ty tabulky svazuje S21DAVKA_UKID, v tom selectu je JOIN ON
S21DAVKAID? Jsou na tech polich indexy? Mno, a nemuzes pouzit INNER JOIN?

Roman
==============================
http://kouzelne.misto.cz

Odpovedá: Ing. Pavel Žilinec

19. 12. 2002 11:11

Nevim, jak na IB, ale snad je to podobne s MS SQL:
  Pro rychly vyber vetsinou plati, ze spojovane sloupce maji indexy a
  pokud mozno jde o ciselny kod (treba v pripade Hlavicka <- Detail),
  pze u textovych hodnot bude spojeni pomalejsi.
  Indexy se automaticky pridaji, pokud je sloupec definovan jako Unique
  nebo jako primarni klic nebo je obsazen v referencni integrite.
  Pokud ani jedno neexistuje, dohod si tam index na ten sloupec rucne.

  Snad Ti to nejak pomuze (podle mne by melo)

--------
ing. Pavel Zilinec
MailTo:zilinec@email.cz

Prog-Soft s.r.o. Plzen
Informacni system pro vyrobce
a distributory napoju

JK> Ahoj lidi,
JK> bojuju s nasledujicim problemem rychlosti. V asi 200MB DB mam jednu tabulku
(A) ktera slouzi jako master pro druhou - detail(B). Tzn v tabulce A si
uzivatel vybere zaznam a v Becku vidi dalsi
JK> detaily. Svazuje je parametr :S21DAVKA_UKID. Nasledujici select je prave ta
tabulka B.

JK> SELECT b.S21DAVKA_UKID, a.S21KOMPID, SUM(a.MNOZSTVI)
JK> FROM S21DAVKAREC a
JK> LEFT JOIN S21DAVKA_UKD b ON (a.S21DAVKAID = b.S21DAVKAID)
JK> WHERE S21DAVKA_UKID = :S21DAVKA_UKID
JK> GROUP BY b.S21DAVKA_UKID, a.S21KOMPID

JK> Problem je v tom, ze pri kazdem posunu mezi radky v tab A probehne
zpracovani tohoto selectu a ono to trva skoro 45!!! sec (na PIII 850 s 256MB
RAM a W2K). Po tu dobu disk skoro nejede, zato
JK> sluzba IBServ jede na 100%.
JK> Neda se tomu nejak pomoct, nebo predelat ten select? Zkousel jsem z toho
udelat proceduru v IB a jen ji spoustet, ale to bylo totez.

JK> Diky Tymi

Odpovedá: Pavel Cisar

19. 12. 2002 15:34

Haj hou!

On 19 Dec 2002 at 10:22, Jaroslav Kohák wrote:

> Ahoj lidi,
> bojuju s nasledujicim problemem rychlosti. V asi 200MB DB mam jednu tabulku
(A) ktera slouzi jako master pro druhou - detail(B). Tzn v tabulce A si
uzivatel vybere zaznam a v Becku vidi dalsi detaily. Svazuje je parametr
:S21DAVKA_UKID. Nasledujici select je prave ta tabulka B.
>
> SELECT b.S21DAVKA_UKID, a.S21KOMPID, SUM(a.MNOZSTVI)
> FROM S21DAVKAREC a
> LEFT JOIN S21DAVKA_UKD b ON (a.S21DAVKAID = b.S21DAVKAID)
> WHERE S21DAVKA_UKID = :S21DAVKA_UKID
> GROUP BY b.S21DAVKA_UKID, a.S21KOMPID
>
> Problem je v tom, ze pri kazdem posunu mezi radky v tab A probehne zpracovani
tohoto selectu a ono to trva skoro 45!!! sec (na PIII 850 s 256MB RAM a W2K).
Po tu dobu disk skoro nejede, zato sluzba IBServ jede na 100%.
> Neda se tomu nejak pomoct, nebo predelat ten select? Zkousel jsem z toho
udelat proceduru v IB a jen ji spoustet, ale to bylo totez.

Pomohlo by, kdyby jsi nam sem poslal PLAN pouzity pro dany dotaz.

S pozdravem
Pavel Cisar
Mobil: 724 281429
http://www.ibphoenix.cz
Vse co potrebujete pro Firebird a InterBase

Odpovedá: Lstiburek Pavel

19. 12. 2002 17:09


> From: Ing. Pavel Žilinec [mailto:zilinec@email.cz]
> Nevim, jak na IB, ale snad je to podobne s MS SQL:
> Pro rychly vyber vetsinou plati, ze spojovane sloupce maji indexy a
> pokud mozno jde o ciselny kod (treba v pripade Hlavicka <- Detail),
> pze u textovych hodnot bude spojeni pomalejsi.
> Indexy se automaticky pridaji, pokud je sloupec definovan
> jako Unique
> nebo jako primarni klic nebo je obsazen v referencni integrite.
Pri optimalizaci slozitych selectu (MSSQL) jsem nahodne zjistil,
ze doplneni indexu pres primarni klic vede nekdy vyraznemu zrychleni
dotazu. Vysvetleni nemam, ale obcas to pouzivam.
Pavel